// 泛型
// 可以使用泛型来创建可重用的组件，一个组件可以支持多种类型的数据。
//  这样用户就可以以自己的数据类型来使用组件。
function listCom(arg:number): number{
    return arg 
}
console.log(listCom(88))

function big(arg: any): any {
  arg=arg.toString()
  return arg;
}
console.log(big(99))
// 类型 number boolean string any tuple enum 等
// 泛型的类型变量 <T> 
// 泛型 可以约束  形参   约束返回值类型  可以约束函数内部的各种数据类型
interface aInter{
  k:string,
  game:boolean
}
function identity<T,U,F>(arg: T,abc:F): T {
  let list:T[]=[]
  let cc:T;
  let dd:U;
  return arg;
}
console.log(identity<string,number,aInter>("哈哈",{k:"11",game:true}))

// T 
function logs<T>(arg: T[]): T[]{
  console.log(arg.length);  // Error: T doesn't have .length
  return arg;
}
function loggingIdentity<T>(arg: Array<T>): Array<T> {
  console.log(arg.length);  // Array has a .length, so no more error
  return arg;
}
console.log(loggingIdentity<number>([1,2,3]))

function plus<T,U>(first:T,second:U):U{
    return second
}
console.log(plus<string,number>("11",88))
console.log(plus<boolean,Array<number>>(true,[1,2,3]))
